package com.pzhu.gmall.cart.controller;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.alibaba.fastjson.JSON;
import com.pzhu.gmall.bean.OmsCartItem;
import com.pzhu.gmall.bean.PmsSkuInfo;
import com.pzhu.gmall.service.CartService;
import com.pzhu.gmall.service.SkuInfoService;
import com.pzhu.gmall.web.utils.CookieUtil;
import com.pzhu.gmall.web.annotations.LoginRequired;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class CartController {

    @Reference
    private SkuInfoService skuInfoService;
    @Reference
    private CartService cartService;


    @RequestMapping("toTrade.html")
    @LoginRequired(needSuccess = true)
    public String toTrade() {
        return "toTrade";
    }

    @RequestMapping("checkCart")
    public String checkCart(String isChecked, Integer quantity, String skuId, HttpServletRequest request, HttpServletResponse response, HttpSession session, ModelMap modelMap) {

        String memberId = (String) request.getAttribute("memberId");
        String nickname = (String) request.getAttribute("nickname");

        // 调用服务，修改状态
        OmsCartItem omsCartItem = new OmsCartItem();
        omsCartItem.setMemberId(memberId);
        omsCartItem.setProductSkuId(skuId);
        omsCartItem.setIsChecked(isChecked);
        omsCartItem.setQuantity(new BigDecimal(quantity));
        cartService.checkCart(omsCartItem);

        // 将最新的数据从缓存中查出，渲染给内嵌页
        List<OmsCartItem> omsCartItems = cartService.cartItemList(memberId);
        modelMap.put("cartList", omsCartItems);

        // 被勾选商品的总额
        BigDecimal totalAmount = omsCartItems.stream().filter(omsCartItem1 -> omsCartItem1.getIsChecked().equals("1")).map(omsCartItem2 -> {
            return omsCartItem2.getPrice().multiply(omsCartItem2.getQuantity());
        }).reduce(BigDecimal.ZERO, BigDecimal::add);

        modelMap.put("totalAmount", totalAmount);
        return "cartListInner";
    }

    @RequestMapping("cartList.html")
    public String cartItemList(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) {
        List<OmsCartItem> omsCartItemList = new ArrayList<>();
        String userId = (String) request.getAttribute("memberId");
        if (StringUtils.isBlank(userId)) {
            //未登录 从cookie中取
            String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);
            omsCartItemList = JSON.parseArray(cartListCookie, OmsCartItem.class);
        } else {
            //登录 从缓存中读取数据

            omsCartItemList = cartService.cartItemList(userId);
        }
        //计算价格
        omsCartItemList.forEach(cartItem -> {
            cartItem.setTotalPrice(cartItem.getQuantity().multiply(cartItem.getPrice()));
        });
        modelMap.put("cartList", omsCartItemList);
        BigDecimal totalAmount =
                omsCartItemList.stream().filter(omsCartItem1 -> omsCartItem1.getIsChecked().equals("1")).map(omsCartItem -> {
                    return omsCartItem.getPrice().multiply(omsCartItem.getQuantity());
                }).reduce(BigDecimal.ZERO, BigDecimal::add);
        modelMap.put("totalAmount", totalAmount);
        return "cartList";
    }

    @RequestMapping("addToCart")
    public String addToCart(String skuId, int quantity, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        try {
            List<OmsCartItem> omsCartItems = new ArrayList<>();
            // 调用商品服务查询商品信息
            PmsSkuInfo skuInfo = skuInfoService.getSkuByItemId(skuId);
            // 将商品信息封装成购物车信息
            OmsCartItem omsCartItem = new OmsCartItem();
            omsCartItem.setCreateDate(new Date());
            omsCartItem.setDeleteStatus(0);
            omsCartItem.setModifyDate(new Date());
            omsCartItem.setPrice(skuInfo.getPrice());
            omsCartItem.setProductAttr("");
            omsCartItem.setProductBrand("");
            omsCartItem.setProductCategoryId(skuInfo.getCatalog3Id());
            omsCartItem.setProductId(skuInfo.getProductId());
            omsCartItem.setProductName(skuInfo.getSkuName());
            omsCartItem.setProductPic(skuInfo.getSkuDefaultImg());
            omsCartItem.setProductSkuCode("11111111111");
            omsCartItem.setProductSkuId(skuId);
            omsCartItem.setQuantity(new BigDecimal(quantity));
            // 判断用户是否登录
            String memberId = (String) request.getAttribute("memberId");
            String nickname = (String) request.getAttribute("nickname");
            if (StringUtils.isBlank(memberId)) {
                // 用户没有登录
                // cookie里原有的购物车数据
                String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);
                if (StringUtils.isBlank(cartListCookie)) {
                    // cookie为空
                    omsCartItems.add(omsCartItem);
                } else {
                    // cookie不为空
                    omsCartItems = JSON.parseArray(cartListCookie, OmsCartItem.class);
                    // 判断添加的购物车数据在cookie中是否存在
                    boolean exist = if_cart_exist(omsCartItems, omsCartItem);
                    if (exist) {
                        // 之前添加过，更新购物车添加数量
                        for (OmsCartItem cartItem : omsCartItems) {
                            if (cartItem.getProductSkuId().equals(omsCartItem.getProductSkuId())) {
                                cartItem.setQuantity(cartItem.getQuantity().add(omsCartItem.getQuantity()));
                            }
                        }
                    } else {
                        // 之前没有添加，新增当前的购物车
                        omsCartItems.add(omsCartItem);
                    }
                }
                // 更新cookie
                CookieUtil.setCookie(request, response, "cartListCookie", JSON.toJSONString(omsCartItems), 60 * 60 * 72, true);
            } else {
                //登录
                // 用户已经登录
                // 从db中查出购物车数据
                OmsCartItem omsCartItemFromDb = cartService.ifCartExistByUser(memberId, skuId);
                if (omsCartItemFromDb == null) {
                    // 该用户没有添加过当前商品
                    omsCartItem.setMemberId(memberId);
                    omsCartItem.setMemberNickname(nickname);
                    omsCartItem.setQuantity(new BigDecimal(quantity));
                    cartService.addCart(omsCartItem);
                } else {
                    // 该用户添加过当前商品
                    omsCartItemFromDb.setQuantity(omsCartItemFromDb.getQuantity().add(omsCartItem.getQuantity()));
                    cartService.updateCart(omsCartItemFromDb);
                }
                // 同步缓存
                cartService.flushCartCache(memberId);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
            System.out.println(e);
        }
        return "redirect:/success.html";
    }

    private boolean if_cart_exist(List<OmsCartItem> omsCartItems, OmsCartItem omsCartItem) {
        boolean b = false;
        for (OmsCartItem cartItem : omsCartItems) {
            String productSkuId = cartItem.getProductSkuId();
            if (productSkuId.equals(omsCartItem.getProductSkuId())) {
                b = true;
            }
        }
        return b;
    }

}
